//main.cp
//g++ -o prog source.cpp `allegro-config --cppflags --libs` - linux
//draw( sprite[int(timer/ani_speed)%frames] );
#include <stdio.h>
#include <allegro.h>
#include "imagem.h"
#include "animacao.h"
#include "fase.h"
#include "personagem.h"
#include "nelib.h"
#include "menu.h"
#include "option.h"
#include "sound.h"

BITMAP *buffer;
volatile int game_time;
volatile int animac_time;

void inc_game_time(){
	game_time++;
}
END_OF_FUNCTION(inc_game_time)

void inc_animac_time(){
	animac_time++;
}
END_OF_FUNCTION(inc_animac_time);

//Variavel de parametro do laço principal
int gamming = 1;

//Variavel que representa o estado dos loops
int game_state = 0;
// 0 - Menu Principal
// 1 - Menu de Fases
// 2 - Fase atual
// 3 - Morto =D

void main_menu_logic(menu *main_menu) {
	if(keypressed()) {
		int keya = readkey() >> 8;
	
		if(keya == KEY_UP)
			main_menu->move(0);
		if(keya == KEY_DOWN)
			main_menu->move(1);
		if(keya == KEY_ENTER) {
			sound::play(sound::menu);
			if(main_menu->selected == 0) {
				game_state = 1;
				return;
			}
			if(main_menu->selected == 1) {
				gamming = 0;
				return;
			}
		}
		if(keya == KEY_ESC) {
			gamming = 0;
			return;
		}
	}
	clear_keybuf();
}

void stage_menu_logic(menu *stage_menu, fase *estagio, personagem *nelson) {
	if(keypressed()) {
		int keya = readkey() >> 8;
		
		if(keya == KEY_UP)
			stage_menu->move(0);
		if(keya == KEY_DOWN)
			stage_menu->move(1);
		if(keya == KEY_ENTER) {
			sound::play(sound::menu);
			if(stage_menu->selected == 0) {
				nelson->x = 50;
				nelson->y = 350;
				fase temp("fase00.txt");
				*estagio = temp;
				game_state = 2;
				return;
			}
			if(stage_menu->selected == 1) {
				nelson->x = 50;
				nelson->y = 350;
				fase temp("fase01.txt");
				*estagio = temp;
				game_state = 2;
				return;
			}
			if(stage_menu->selected == 2) {
				nelson->x = 50;
				nelson->y = 350;
				fase temp("animefase.txt");
				*estagio = temp;
				game_state = 2;
				return;
			}
			if(stage_menu->selected == 3) {
				game_state = 0;
				return;
			}
		}
		if(keya == KEY_ESC) {
			game_state = 0;
			return;
		}
	}
	clear_keybuf();
}

void stage_logic(int *animac_atual, int *vely, personagem *nelson, fase *estagio){
	int chao = 0;
	clear_keybuf();
	
	if (estagio->cut_n != 0) {
		estagio->els[0].draw(buffer);
	}
	
	if (key[KEY_RIGHT]) {

		nelson->x = estagio->colisao_x(nelson->x, nelson->y, nelson->w, nelson->h, (VELX * 1), &game_state);

      		if (nelson->x + nelson->w > estagio->w)
			nelson->x = estagio->w - nelson->w;

		if ( nelson->x + nelson->w > (estagio->x + 60 * (TELA_W/100)) ) {
			if ((estagio->x + TELA_W) + ((nelson->x + nelson->w) - (estagio->x + 60 * (TELA_W/100))) > estagio->w) {
			estagio->x = estagio->w - TELA_W;
			}
			else {
				estagio->x += (nelson->x + nelson->w) - (estagio->x + 60 * (TELA_W/100));
			}
			if (estagio->w != TELA_W)
				estagio->background->x = ( estagio->x *  (estagio->background->w - TELA_W) ) / (estagio->w - TELA_W);
		}

		if (*animac_atual!=0){
			*animac_atual = 0;
			animac_time = 0;
		}
		nelson->count[*animac_atual] = animac_time;
	}

	else if (key[KEY_LEFT]) {

		nelson->x = estagio->colisao_x(nelson->x, nelson->y, nelson->w, nelson->h, (VELX * -1), &game_state);
      
		if (nelson->x < 0)
			nelson->x = 0;

		if (nelson->x < (estagio->x + 40 * (TELA_W/100)) ) {
			if ((estagio->x) - ((estagio->x + 40 * (TELA_W/100)) - nelson->x) < 0)
				estagio->x = 0;
			else
				estagio->x -= (estagio->x + 40 * (TELA_W/100)) - nelson->x;

			if (estagio->w != TELA_W)
				estagio->background->x = (estagio->x * (estagio->background->w - TELA_W) )/ (estagio->w - TELA_W);
		}
		
		if (*animac_atual!=1){
			*animac_atual = 1;
			animac_time = 0;
		}
		nelson->count[*animac_atual] = animac_time;
	}
   
	else if (*animac_atual == 0)
		*animac_atual = 2;
	else if (*animac_atual == 1)
		*animac_atual = 3;

	nelson->y = estagio->colisao_y(nelson->x, nelson->y, nelson->w, nelson->h, vely, &chao, &game_state);

	*vely += G;

	if (key[KEY_UP] && chao) {
		*vely = -1 * PULO;
		sound::play(sound::pulo);
	}
	if(key[KEY_ESC]) {
		game_state = 1;
		return;
	}
	if(key[KEY_J]) {
		nelson->x = estagio->colisao_x(nelson->x, nelson->y, nelson->w, nelson->h, 200, &game_state);
      		if (nelson->x + nelson->w > estagio->w)
			nelson->x = estagio->w - nelson->w;
		if ( nelson->x + nelson->w > (estagio->x + 60 * (TELA_W/100)) ) {
			if ((estagio->x + TELA_W) + ((nelson->x + nelson->w) - (estagio->x + 60 * (TELA_W/100))) > estagio->w) {
			estagio->x = estagio->w - TELA_W;
			}
			else {
				estagio->x += (nelson->x + nelson->w) - (estagio->x + 60 * (TELA_W/100));
			}
			if (estagio->w != TELA_W)
				estagio->background->x = ( estagio->x *  (estagio->background->w - TELA_W) ) / (estagio->w - TELA_W);
		}

	}
	else if(key[KEY_H]) {
		nelson->x = estagio->colisao_x(nelson->x, nelson->y, nelson->w, nelson->h, -200, &game_state);
      	
		if (nelson->x < 0)
			nelson->x = 0;
			
		if (nelson->x < (estagio->x + 40 * (TELA_W/100)) ) {
			if ((estagio->x) - ((estagio->x + 40 * (TELA_W/100)) - nelson->x) < 0)
				estagio->x = 0;
			else
				estagio->x -= (estagio->x + 40 * (TELA_W/100)) - nelson->x;
	
			if (estagio->w != TELA_W)
				estagio->background->x = (estagio->x * (estagio->background->w - TELA_W) )/ (estagio->w - TELA_W);
		}
	}
}

void game_logic(int *animac_atual, int *vely, personagem *nelson, fase *estagio, menu *main_menu, menu *stage_menu){
	switch(game_state) {
		case (0):
			main_menu_logic(main_menu);
			break;
		case (1):
			stage_menu_logic(stage_menu, estagio, nelson);
			break;
		case (2):
			stage_logic(animac_atual, vely, nelson, estagio);
			break;
		case (3):
			if (keypressed())
				gamming = 0;
			break;
	}
}

void draw(int animac_atual, personagem nelson, fase estagio, menu main_menu, menu stage_menu, menu game_over) {
	acquire_screen();
	switch(game_state) {
		case (0):
			main_menu.draw(buffer);
			break;
		case (1):
			stage_menu.draw(buffer);
			break;
		case (2):
			estagio.draw_background(buffer);
			estagio.draw_obj(buffer);
			nelson.draw(animac_atual, buffer, estagio);
			break;
		case (3):
			game_over.draw(buffer);
			break;
	}
	draw_sprite(screen, buffer, 0, 0);
	release_screen();
}

int main() {
	int vely = 0;
	int animac_atual = 0;

	allegro_init();
	install_timer();
#ifndef NO_SOUND
	install_sound(MIDI_AUTODETECT, DIGI_AUTODETECT, NULL);
#endif

	install_keyboard();

	set_color_depth(16);
	set_gfx_mode( GFX_AUTODETECT_WINDOWED, TELA_W, TELA_H, 0, 0);

	LOCK_VARIABLE(game_time);
	LOCK_FUNCTION(inc_game_time);
	LOCK_VARIABLE(animac_time);
	LOCK_FUNCTION(inc_animac_time);

	buffer = create_bitmap(800, 600);
		
	personagem nelson("personagem.txt");
	fase estagio("animefase.txt");
	menu main_menu("main_menu.txt");
	menu stage_menu("stage_menu.txt");
	menu game_over("game_over.txt");
		estagio.toca();
	
	install_int_ex(inc_game_time, BPS_TO_TIMER(20));
	install_int_ex(inc_animac_time, BPS_TO_TIMER(10));
	
	while(gamming) {
		while(game_time) {
			game_logic(&animac_atual, &vely, &nelson, &estagio, &main_menu, &stage_menu);
			game_time--;
		}
		draw(animac_atual, nelson, estagio, main_menu, stage_menu, game_over);
		while(!game_time)
			rest(1);
	}
	estagio.para_toca();
	return 0;
}
END_OF_MAIN();
